package main;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import canon.BasicBlocks;
import canon.Canon;
import canon.StmListList;

import parser.MyParser;
import parser.ParseException;

import syntaxtree.Program;
import translate.Frag;
import translate.FragList;
import translate.Translate;
import tree.Stm;
import tree.StmList;
import util.LerArquivo;
import visitor.IRTreeCreator;
import visitor.IRTreePrint;
import visitor.PrettyPrintVisitor;
import visitor.SymbolTableCreator;
import visitor.TypeCheckVisitor;

class Main {
	
	public static void main(String[] args) throws Exception {

		LerArquivo lerArquivo = new LerArquivo();
		String text = lerArquivo.carregarPrograma("../Parser/src/main/codigoFonte.mj");
		InputStream is = new ByteArrayInputStream(text.getBytes());
		new MyParser(is);
		Program root;				
		try {
			
			System.out.println("------------ Analisador Sintatico ------------------");
			//Analisador Sintático
			root = MyParser.Program();
			root.accept(new PrettyPrintVisitor());
			System.out.println("");
			System.out.println("MiniJava program parsed successfully.");
			System.out.println("");
			System.out.println("------------ Analisador Semantico ------------------");
			System.out.println("");	
			
			//Analisador Semântico

			SymbolTableCreator Tabela = new SymbolTableCreator();

			root.accept(Tabela);
			Tabela.setExtends();
			TypeCheckVisitor VerificadorTipo = new TypeCheckVisitor(Tabela.getClasses(), Tabela.getMap_class());
			root.accept(VerificadorTipo);
			Tabela.imprime();
			VerificadorTipo.imprimeErros();
			
			IRTreeCreator IRTree = new IRTreeCreator();
			IRTreePrint IRPrint = new IRTreePrint();
			root.accept(IRTree);
			
			
			
			//coisas que eu criei só pra não ficar aparecendo o erro
			FragList fragList;
			
			fragList = Frag.list;
		
			//canonização
			//Percorrer lista de fragmentos e canonizar a IRTree de cada um
			System.out.println(" -------- Código Intermediário -------- ");
			while (fragList != null){	
				
				System.out.println("IR Tree Método: " + fragList.head.name);
				fragList.head.irtree.accept(IRPrint);
				//fragList.head.canonic = Canon.linearize(fragList.head.irtree);
				
				//System.out.println("Árvore Canônica: ");
				//while(aux!=null){
				//	aux.head.accept(IRPrint);
				//	aux = aux.tail;
				//}			
				fragList = fragList.tail;
				System.out.println("");
				System.out.println("");
				
			}
			
			//Blocos Basicos

			
		} catch (ParseException e) {
			System.out.println(e.getMessage());
			System.out.println("Encountered errors during parse.");
			return;
		} catch (Exception e)
		{
			System.out.println("");
			System.out.println("Infelizmente, seu código-fonte está errado:");
			System.out.println(e.getMessage());
			e.printStackTrace();
			MyParser.ReInit(is);
		}
		catch (Error e)
		{
			System.out.println("Oops. Temos um ou mais erros");
			System.out.println(e.getMessage());
		}			
		
	}
}


